﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Web.Services;
using System.Web.UI;
using App_Code.Clases;
using App_Code.Utilidades;
using SubSonic.Repository;

public partial class Usuario_VerCarrito : Page
{
    static readonly SimpleRepository repository= new SimpleRepository("Electro",SimpleRepositoryOptions.None);
    protected void Page_Load(object sender, EventArgs e)
    {
        Validaciones.ValidarSession();
        if(!Page.IsPostBack)
        {
            var clienteSinPerfil = false;
            var cliente =repository.Single<Cliente>(x=>x.IdPerfil== SesionUsuario.UsuarioSesion.IdPerfil);
            clienteSinPerfil = cliente == null ? true : false;
            Session["ClienteSinPerfil"] = clienteSinPerfil;
            if(clienteSinPerfil)
            {
                lblError.Text = "Debe llenar su perfil antes de consultar el carrito<br/>Vaya a <i>Mi cuenta</i> y llene el perfil.";
                return;
            }

            var carrito = repository.Single<OrdenCompra>(x => x.IdCliente == cliente.Id && x.Estado == 0);
            if(carrito==null)
            {
                carrito=new OrdenCompra()
                            {
                                Estado = 0,
                                FechaCreacion = DateTime.Now,
                                FechaEntrega = DateTime.Now,
                                FechaSolicitud = DateTime.Now,
                                IdCliente = cliente.Id
                            };
                repository.Add(carrito);
            }
            CarritoCompra.OrdenCompra = carrito;
            CargarProductosCarrito();
        }
    }


    public void CargarProductosCarrito()
    {
        Validaciones.ValidarSession();
        var productos = from p in repository.Find<ProductoEnOrden>(x => x.IdOrdenCompra == CarritoCompra.OrdenCompra.Id)
                        select p;
        var productosOrden = new List<ProductoOrdenCarrito>();
        foreach (var prod in productos)
        {
            var prodCarrito = new ProductoOrdenCarrito()
                                  {
                                      Cantidad = prod.Cantidad,
                                      IdOrdenCompra = CarritoCompra.OrdenCompra.Id,
                                      Precio = prod.Precio,
                                      Producto = repository.Single<Producto>(prod.IdProducto),
                                      IdProductoEnOrden = prod.Id
                                  };
            productosOrden.Add(prodCarrito);
        }
        CarritoCompra.ProductosEnOrden = productosOrden;
    }

    [WebMethod]
    public static object AgregarProductoOrden(int idProducto,int cantidad)
    {
        try
        {
            Validaciones.ValidarSession();
            var cliente =repository.Single<Cliente>(x=>x.IdPerfil== SesionUsuario.UsuarioSesion.IdPerfil);
            var carrito = repository.Single<OrdenCompra>(x => x.IdCliente == cliente.Id && x.Estado == 0);
            if(carrito==null)
            {
                carrito=new OrdenCompra()
                            {
                                Estado = 0,
                                FechaCreacion = DateTime.Now,
                                FechaEntrega = DateTime.Now,
                                FechaSolicitud = DateTime.Now,
                                IdCliente = cliente.Id
                            };
                repository.Add(carrito);
            }
            
            var producto = repository.Single <Producto>(idProducto);
            var productoOrden =
                repository.Single<ProductoEnOrden>(x => x.IdProducto == idProducto && x.IdOrdenCompra == carrito.Id);
            if(productoOrden==null)
            {
                productoOrden = new ProductoEnOrden()
                                    {
                                        Cantidad = cantidad,
                                        IdOrdenCompra = carrito.Id,
                                        IdProducto = idProducto,
                                        Precio = producto.Precio
                                    };
                repository.Add(productoOrden);
            }
            else
            {
                productoOrden.Cantidad = productoOrden.Cantidad + cantidad;
                repository.Add(productoOrden);
            }
            
            return new {Correcto = true};
        }
        catch(Exception ex)
        {
            return new { Correcto = false,Mensaje="Ha ocurrido un error: "+ex.Message };
        }
        
    }

    [WebMethod]
    public static object ProcesarCarrito()
    {
        try
        {
            Validaciones.ValidarSession();
            var cliente = repository.Single<Cliente>(x => x.IdPerfil == SesionUsuario.UsuarioSesion.IdPerfil);
            var carrito = repository.Single<OrdenCompra>(x => x.IdCliente == cliente.Id && x.Estado == 0);
            if(carrito!=null)
            {
                carrito.Estado = 1;
                repository.Update(carrito);
            }
            return
                new
                    {
                        Correcto = true,
                        Mensaje = "El carrito de compras ha sido procesador, y será enviado a la direccion solicitada."
                    };
            
        }
        catch(Exception ex)
        {
            return new { Correcto = false, Mensaje = "Ha ocurrido un error: " + ex.Message };
        }
    }

    [WebMethod]
    public static object EliminarProductoCarrito(int idProductoEnOrden)
    {
        try
        {
            var detalleProd = repository.Single<ProductoEnOrden>(idProductoEnOrden);
            var codProducto = repository.Single<Producto>(detalleProd.IdProducto).Codigo;
            repository.Delete<ProductoEnOrden>(idProductoEnOrden);
            return new {Correcto = true, Mensaje = "El producto " + codProducto + " ha sido eliminado del carrito."};
        }
        catch(Exception ex)
        {
            return new {Correcto = false, Mensaje = "Ha ocurrido un error:\n" + ex.Message};
        }
    }

    [WebMethod]
    public static object ObtenerDatosProcesarCarrito()
    {
        try
        {
            Validaciones.ValidarSession();
            var cliente = repository.Single<Cliente>(x => x.IdPerfil == SesionUsuario.UsuarioSesion.IdPerfil);
            var cuentas = from c in repository.Find<Cuenta>(x => x.IdCliente == cliente.Id)
                          select new {c.Id,c.Nombre};

            var direcciones = from d in repository.Find<DireccionCliente>(x => x.IdCliente == cliente.Id)
                              select new {d.Id, d.Nombre};
            return new {Correcto = true, direcciones, cuentas};

        }
        catch(Exception ex)
        {
            return new { Correcto = false, Mensaje = "Ha ocurrido un error:\n" + ex.Message };
        }
    }
}
